home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_08_06
/
8n06049a
< prev
next >
Wrap
Text File
|
1989-06-10
|
2KB
|
58 lines
Listing 1. The bit-wide technique: a straightforward but slow way to
decode a Group 3 image
#define INVALID_CODE -1
#define EOL_CODE -2
decode_image () {
...
while (!end_of_file) {
/* loop for each row in the image */
...
while (!end_of_row) {
/* loop for each pair of runs in the row */
int runlength;
while (63 < (runlength = decode_white_run ())) {
if (runlength == EOL_CODE) end_of_row = TRUE;
else if (runlength == INVALID_CODE)
... error condition ...;
else /* a legal white run */
spit_out_white_pixels (runlength);
}
while (63 < (runlength = decode_black_run ())) {
if (runlength == EOL_CODE) end_of_row = TRUE;
else if (runlength == INVALID_CODE)
... error condition ...;
else /* a legal black run */
spit_out_black_pixels (runlength);
}
}
}
}
int decode_white_run () {
if (next_bit ()) /* 1... */ {
if (next_bit ()) /* 11... */ {
if (next_bit ()) /* 111... */ {
if (next_bit ()) /* 1111 */ return (7);
else /* 1110 */ return (6);
}
else /* 110... */ {
if (next_bit ()) /* 1101... */ {
if (next_bit ()) /* 1101 1 */ return (64);
else /* 1101 0... */ {
if (next_bit ()) /* 1101 01 */ return (15);
... omit a lot of ifs and elses and braces ...
if (next_bit ()) /* 0000 0000 001 */ return (INVALID_CODE);
else /* 0000 0000 000... */ {
if (next_bit ()) /* 0000 0000 0001 */ return (EOL_CODE);
else /* 0000 0000 0000 */ return (INVALID_CODE);
... omit a lot of braces ...
}
int decode_black_run () {
... a lot like the preceding ... }